查看原文
其他

被离职前同事的代码坑惨了。。。

脚本之家 2022-09-23

The following article is from 小夕学算法 Author 小夕

 关注脚本之家”,与百万开发者在一起

作者| 小夕

来源| 小夕学算法(ID:gh_a73f3afde197)
已获得原公众号的授权转载
class HostObejct{
  String productName;
  String appName;
  String 其它信息;
}

第一次请求的时候 代码初次执行

代码刚开始执行的时候:

会 new 一个对象

HostObejct hostObejct = new HostObejct().

然后根据用户传入的key值去查 redis 缓存里面的内容。

redis缓存里面没查到这key

如果使用这个key值没查到对应的 redis 缓存里面的内容

根据key值去查数据库记录查到了

那么会根据key值去数据库里面查到对应的需要记录,并把记录写入到redis缓存里面。

这样下次可以直接从缓存中去拿。

根据key值去查数据库记录没查到

这个时候就有意思了,这代码写得贼坑。

给小夕坑惨了。。。

它也会写入到缓存中,key是一样的,

但是value的话,写入的是 刚开始创建的对象

HostObejct hostObejct = new HostObejct().

由于这个对象里面没有进行赋值,所以 productName 是 null

后续同样的接口访问过来

根据这个 key 去查 redis 缓存

按照小夕刚才说的思路,由于redis缓存里面存了一个刚new的对象,

所以value不是空的。

这个时候会判断这个 value 对象里面的 productName 是不是空的,如果是空的话, 说明没有对应的产品线信息,那么就会抛出异常,下面继续从库里面查询的逻辑就无法执行了。。。

导致本身可以通过数据库查到的逻辑,无法执行到了。。。

难受、、、

小夕画了几张图

整体代码的流程图

第一次访问如果redis里面没查到

可以看到给redis里面写了一个productName 为null的对象

第二次同样的请求过来的流程图

可以看到直接就抛异常了。。。

这里明显不对,因为数据库里面是有记录的,必须让用户能查到数据才对。。。

正确的逻辑流程图

解决问题

小夕给擦了屁股,修了bug。

当从数据库没查到对应的记录的时候,就不去redis里面写数据了。。。

太难了。。。

<END>

程序员专属T恤

商品直购链接 👇

  推荐阅读:

这是一件程序员才懂的T恤

我,被大厂裁员后,做了外包
阅读别人的代码,是一种怎样的体验

“离职后,前老板让我回去改代码......”

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存